package demo;

import java.util.Arrays;

/**
 * 手撕 ArrayList, 仿写ArrayList
 * 仿写的API要与原版ArrayList功能一致
 */
public class MyArrayList<E> {
    private Object[] elementData = new Object[0];
    private int size = 0;

    /**
     * 将数据追加到集合中
     * add("Tom")
     * add("Jerry")
     * add("Andy")
     * ...
     * add("Wang") 9  length=10 size=10
     * add("熊大") 10
     */
    public boolean add(E e){
        //先确认容量, 再添加元素
        ensureCapacity();
        elementData[size++]=e;
        return true;
    }

    /**
     * ensure 确保/确认
     * Capacity 容量
     */
    private void ensureCapacity(){
        //第一次添加元素, 创建一个10元素的对象数组
        if(size == 0){
            elementData = new Object[10];
        }
        //当数组满了的时候，需要扩容1.5倍
        if(size == elementData.length){
            //扩容 新数组=Arrays.copyOf(原数组，新容量) Capacity:容量
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity>>1);
            elementData = Arrays.copyOf(elementData, newCapacity);
            System.out.println("新容量："+newCapacity);
        }
    }

    /**
     * 插入方法
     * 将元素插入到指定位置，原有数据将向后移动
     * 数据插入范围: 0 1 2 3 ... size
     */
    public void add(int index, E e){
        //检查是否超过范围
        if (index<0 || index>size){
            throw new IndexOutOfBoundsException("越界:"+index);
        }
        if(index == size){ //在尾部追加
            add(e);
            return;
        }
        //先确认容量
        ensureCapacity();
        //移动元素
        for (int i=size-1; i>=index ;i--){
            elementData[i+1] = elementData[i];
        }
        //插入元素
        elementData[index] = e;
        size++;
    }

    public E get(int index){
        return (E)elementData[index];
    }
    public int size(){
        return size;
    }
}


